package util

// 导入bcrypt加密库，该库是Go官方推荐的密码哈希实现，基于bcrypt算法
// bcrypt算法特点：自带盐值（Salt）生成，支持自适应哈希成本（Cost），安全性高
import "golang.org/x/crypto/bcrypt"

// HashPassword 对原始密码进行bcrypt哈希处理
// 参数：
//
//	password string：用户输入的原始明文密码（如登录/注册时的密码）
//
// 返回值：
//
//	string：哈希处理后的密码字符串（包含盐值，可直接存储到数据库）
//	error：哈希过程中可能出现的错误（如内存分配失败等，实际业务中需处理）
func HashPassword(password string) (string, error) {
	// 1. 调用bcrypt.GenerateFromPassword生成密码哈希
	// 第一个参数：将字符串密码转为字节切片（bcrypt库函数要求输入为[]byte类型）
	// 第二个参数：哈希成本（Cost），使用bcrypt.DefaultCost（默认值为10）
	// 成本说明：成本值是2的幂次，值越大，哈希计算耗时越长，破解难度越高
	// （例如Cost=10表示哈希计算需2^10=1024次迭代，生产环境可根据服务器性能调整为12-14）
	hashBytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)

	// 2. 将字节切片形式的哈希结果转为字符串，返回给调用方
	return string(hashBytes), err
}

// CheckPassword 验证明文密码与存储的哈希密码是否匹配
// 参数：
//
//	hashPassword string：从数据库中读取的已哈希密码（包含盐值）
//	password string：用户当前输入的明文密码（如登录时输入的密码）
//
// 返回值：
//
//	bool：true表示密码匹配，false表示不匹配
func CheckPassword(hashPassword, password string) bool {
	// 1. 调用bcrypt.CompareHashAndPassword对比哈希与明文密码
	// 第一个参数：数据库存储的哈希密码（转为[]byte）
	// 第二个参数：用户输入的明文密码（转为[]byte）
	// 函数逻辑：自动从hashPassword中提取盐值，用相同盐值和算法对明文密码哈希，再对比结果
	// 注意：该函数会处理盐值的提取和重新哈希，无需业务层手动管理盐值
	err := bcrypt.CompareHashAndPassword([]byte(hashPassword), []byte(password))

	// 2. 若err为nil，说明对比成功（密码匹配），返回true；否则返回false
	// （常见错误：bcrypt.ErrMismatchedHashAndPassword，表示密码不匹配，此时err != nil）
	return err == nil
}
